{# 编码模板 #}
{%- macro render_dpt_data_encoder(dpt_data) -%}
{%- if dpt_data.数据类型 in ['Mem'] -%}
TDptEncoderWrite{{ dpt_data.数据类型 }}(&encoder, msg->{{ dpt_data.数据代码 }}, ({{ dpt_data.数据长度 }} > 0 ? {{ dpt_data.数据长度 }} : 0))
{%- elif dpt_data.数据类型 in ['Int8', 'UInt8'] -%}
TDptEncoderWrite{{ dpt_data.数据类型 }}(&encoder, msg->{{ dpt_data.数据代码 }})
{%- elif dpt_data.数据类型 in ['Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64'] -%}
TDptEncoderWrite{{ dpt_data.数据类型 }}(&encoder, msg->{{ dpt_data.数据代码 }}, {{ dpt_brief.字节序反转 }})
{%- else -%}
#error 数据类型无效，检查定义表
{%- endif -%}
{%- endmacro -%}

{# 解码模板 #}
{%- macro render_dpt_data_decoder(dpt_data) -%}
{%- if dpt_data.数据类型 in ['Mem'] -%}
TDptDecoderRead{{ dpt_data.数据类型 }}(&decoder, &msg->{{ dpt_data.数据代码 }}, ({{ dpt_data.数据长度 }} > 0 ? {{ dpt_data.数据长度 }} : 0))
{%- elif dpt_data.数据类型 in ['Int8', 'UInt8'] -%}
TDptDecoderRead{{ dpt_data.数据类型 }}(&decoder, &msg->{{ dpt_data.数据代码 }})
{%- elif dpt_data.数据类型 in ['Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64'] -%}
TDptDecoderRead{{ dpt_data.数据类型 }}(&decoder, &msg->{{ dpt_data.数据代码 }}, {{ dpt_brief.字节序反转 }})
{%- else -%}
#error 数据类型无效，检查定义表
{%- endif -%}
{%- endmacro -%}


{# 每个消息要实现的模板 #}
{% macro render_dpt_msg(dpt_msg) %}
/****************************************************************************************************
 * @did     {{ dpt_msg.消息编号 }} -> k{{ dpt_brief.协议代码 }}MsgId{{ dpt_msg.消息代码 }}
 * @name    {{ dpt_msg.消息名称 }}
 * @brief   {{ dpt_msg.消息说明 }}

 * typedef struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Tag T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }};
 * struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Tag
 * {
    {%- for dpt_data in dpt_msg.data_list %}
    {%- if dpt_data.数据类型 in ['Mem'] %}
 *  void *{{ dpt_data.数据代码 }};    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}, 数据长度：{{ dpt_data.数据长度 }}
    {%- else %}
 *  {{ dpt_data.数据类型}} {{ dpt_data.数据代码 }};    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}
    {%- endif %}
    {%- endfor %}
 * };
 ****************************************************************************************************/

/**
 * @brief   {{ dpt_msg.消息名称 }} 消息（did:{{ dpt_msg.消息编号 }}）编码函数
 * @param   msg 数据结构指针
 * @param   buf 数据缓冲区
 * @param   len 数据缓冲区长度
 * @return  >=0 成功，编码使用的数据包长度
 *          < 0 失败
 */
Int32 {{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Encode(T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }} *msg, Byte *buf, Int32 len)
{
    Int32 result = -1;
    TDptEncoder encoder;
    
    if (msg != NULL && buf != NULL && TDptEncoderCreate(&encoder, buf, len))
    {
        {%- for dpt_data in dpt_msg.data_list -%}
        {%- if not Dpt_IsNull(dpt_data.数据常量) %}
        msg->{{ dpt_data.数据代码 }} = {{ Dpt_CCodeConstValue(dpt_data.数据常量) }};
        {%- endif %}
        {%- endfor %}

        if ({%- for dpt_data in dpt_msg.data_list -%}
            {% if not loop.first %}&& {% endif %}{{ render_dpt_data_encoder(dpt_data) }} 
            {% endfor -%})
        {
            result = TDptEncoderWritePosition(&encoder);
        }
        else
        {
            result = -2; // 缓存不足
        }

        TDptEncoderDestroy(&encoder);
    }
    
    return result;
}

/**
 * @brief   {{ dpt_msg.消息名称 }} 消息（did:{{ dpt_msg.消息编号 }}）解码函数
 * @param   msg 数据结构指针
 * @param   buf 数据缓冲区
 * @param   len 数据缓冲区长度
 * @return  >=0 成功，解码消耗的数据包长度
 *          < 0 失败
 */
Int32 {{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Decode(T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }} *msg, const Byte *buf, Int32 len)
{
    Int32 result = -1;
    TDptDecoder decoder;
    
    if (msg != NULL && buf != NULL && TDptDecoderCreate(&decoder, (const UInt8 *)buf, len))
    {
        if ({%- for dpt_data in dpt_msg.data_list -%}
            {% if not loop.first %}&& {% endif %}{{ render_dpt_data_decoder(dpt_data) }} 
            {% endfor -%})
        {
            result = TDptDecoderReadPosition(&decoder);
        }
        else
        {
            result = -2; // 缓存不足
        }

        TDptDecoderDestroy(&decoder);
    }
    
    return result;
}
{% endmacro -%}
{# ----------------------------------- 文件生成内容 --------------------------------------- #}
/***** File generated by dpt(tool data_protocol_tool). ******/
/**
 * @file        {{ var_filename }}.c
 * @brief       XXXX
 * @note        XXXX
 * @author      {{ var_author }}({{ var_email }})
 * @date        {{ var_date }}
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>{{ var_date }}   <td>1.0         <td>{{ var_author }}       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */
 
#include "{{ var_filename }}.h"
#include "dpt_decoder.h"
#include "dpt_encoder.h"

// 编解码函数实现
{%- for dpt_msg in dpt_msg_list %}
{{ render_dpt_msg(dpt_msg) }}
{%- endfor %}

